package com.st.qdmall.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.st.qdmall.entity.User;
/**
 * 1. 拦截器 是一种组件， 在进行页面之前进行预处理
 * 		比如： 登录验证
 * 		在项目中，存在多个页面，必须要求用户登录后才能访问
 * 		在拦截器，统一对用户的登录进行验证，
 * 		验证成功， 可以选择放行，用户就可以访问到这些页面
 * 		验证失败，可以选择拦截，跳转到指定的页面。
 * 
 * 2. 拦截器的使用
 * 		1） 在项目下，创建一个包com.st.admall.interceptor
 * 		2) 在包下，创建一个类，UserInterceptor
 * 		3) 这个类，需要实现HandlerInterceptor接口
 * 		4） 根据需求，完成接口中的方法
 * 		5） 为这个拦截器，配置好拦截路径
 * 			创建一个包： com.st.qdmall.config 
 * 			创建一个配置类： WebConfig
 * 			下一步，请参见WebConfig类里的注释 
 * 
 */


@Component
public class UserInterceptor implements HandlerInterceptor {

	/**
	 * 由于 HandlerInterceptor中，将方法写成了default默认方法
	 * 
	 * 右键-》 sources -> Override/implements methods, 
	 * 在弹出的窗口中，选择需要重写方法。
	 */
	
	/**
	 * preHandler
	 * 	在处理器（Controller中写的方法）执行前执行
	 * 返回值： 布尔型
	 * 		true	: 表示拦截器放行。处理器将会被执行
	 * 		false	： 表示拦截器拦截， 处理器不会被执行了
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		// 验证用户是否登录
		// 需要Session， 可以通过request对象获取Session
		HttpSession session = request.getSession();
		
		User user = (User) session.getAttribute("user");
		
		if (user == null) {
			// 用户没有登录
			// 跳转到登录页面
			response.sendRedirect("login.do");
			
			return false;
		}
		
		return true;
	}

	
	/**
	 * 在Handler执行之后，执行
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	/**
	 * 在视图渲染完成之后执行
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}

}





